package com.coc.core.redis;

import com.coc.core.utils.DateUtil;
import com.coc.entity.core.ResConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.util.Collection;
import java.util.Set;
import java.util.concurrent.TimeUnit;

/**
 * redis操作工具类
 */
@Component
public class RedisOptCacheUtils {
    @Autowired
    private ResConfig resConfig;
    /*常量，各种实现方式都行，这里读取application.yml*/
    @Autowired
    private RedisTemplate<String, String> redisTemplate;

    // 维护一个本类的静态变量

    private static RedisOptCacheUtils cacheUtils;

    @PostConstruct

    public void init() {

        cacheUtils = this;

        cacheUtils.redisTemplate = this.redisTemplate;

    }

    /**

     * 将参数中的字符串值设置为键的值，不设置过期时间

     * @param key

     * @param value 必须要实现 Serializable 接口

     */

    public static void set(String key, String value) {

        cacheUtils.redisTemplate.opsForValue().set(key, value);

    }

    /**

     * 将参数中的字符串值设置为键的值，设置过期时间

     * @param key

     * @param value 必须要实现 Serializable 接口

     * @param timeout

     */

    public static void set(String key, String value, Long timeout) {

        cacheUtils.redisTemplate.opsForValue().set(key, value, timeout, TimeUnit.SECONDS);

    }

    /**

     * 获取与指定键相关的值

     * @param key

     * @return

     */

    public static Object get(String key) {

        return cacheUtils.redisTemplate.opsForValue().get(key);

    }

    /**

     * 设置某个键的过期时间

     * @param key 键值

     * @param ttl 过期秒数

     */

    public static boolean expire(String key, Long ttl) {

        return cacheUtils.redisTemplate.expire(key, ttl, TimeUnit.SECONDS);

    }

    /**

     * 判断某个键是否存在

     * @param key 键值

     */

    public static boolean hasKey(String key) {

        return cacheUtils.redisTemplate.hasKey(key);

    }

    /**
     * 判断key和field下是否有值
     *
     * @param key 判断的key
     * @param field 判断的field
     */
    public Boolean hasKey(String key,String field) {
        return redisTemplate.opsForHash().hasKey(key,field);
    }
    /**

     * 向集合添加元素

     * @param key

     * @param value

     * @return 返回值为设置成功的value数

     */

    public static Long sAdd(String key, String... value) {

        return cacheUtils.redisTemplate.opsForSet().add(key, value);

    }

    /**

     * 获取集合中的某个元素

     * @param key

     * @return 返回值为redis中键值为key的value的Set集合

     */

    public static Set<String> sGetMembers(String key) {

        return cacheUtils.redisTemplate.opsForSet().members(key);

    }

    /**

     * 将给定分数的指定成员添加到键中存储的排序集合中

     * @param key

     * @param value

     * @param score

     * @return

     */

    public static Boolean zAdd(String key, String value, double score) {

        return cacheUtils.redisTemplate.opsForZSet().add(key, value, score);

    }

    /**

     * 返回指定排序集中给定成员的分数

     * @param key

     * @param value

     * @return

     */

    public static Double zScore(String key, String value) {

        return cacheUtils.redisTemplate.opsForZSet().score(key, value);

    }

    /**

     * 删除指定的键

     * @param key

     * @return

     */

    public static Boolean delete(String key) {

        return cacheUtils.redisTemplate.delete(key);

    }
    /**
     * 查询key和field所确定的值
     *
     * @param key 查询的key
     * @param field 查询的field
     * @return HV
     */
    public Object hget(String key,String field) {
        return redisTemplate.opsForHash().get(key, field);
    }

    /**
     * 查询该key下所有值
     *
     * @param key 查询的key
     * @return Map<HK, HV>
     */
    public Object hget(String key) {
        return redisTemplate.opsForHash().entries(key);
    }

    /**
     * 添加单个
     * 默认过期时间为两小时
     * @param key    key
     * @param filed  filed
     * @param domain 对象
     */
    public void hset(String key,String filed,Object domain){
        redisTemplate.opsForHash().put(key, filed, domain);
    }
    /**
     * 添加单个
     * @param key    key
     * @param filed  filed
     * @param domain 对象
     * @param expire 过期时间（毫秒计）
     */
    public void hset(String key,String filed,Object domain,Long expire){
        redisTemplate.opsForHash().put(key, filed, domain);
        redisTemplate.expire(key, expire,TimeUnit.SECONDS);
    }

    /**

     * 删除多个键

     * @param keys

     * @return

     */

    public static Long delete(Collection<String> keys) {

        return cacheUtils.redisTemplate.delete(keys);

    }
    public void setToken(String key, String value) {

        cacheUtils.redisTemplate.opsForValue().set(key, value, resConfig.getValidTime(), TimeUnit.SECONDS);

    }
}
